<?php
class Delivery_Model_Mapper_Promociones
	extends Delivery_Model_Mapper_Abstract
{
	
	public function getDbTable()
	{
		return parent::getDbTable( 'Promociones' );
	}
	
	public function save ( $promocion ){
		
		$dbTable= $this->getDbTAble();
		
		$mapper = Delivery_Model_Factory::mapper('ItemsPromocion');
		
		if ( ! $promocion->getId() ){	
			$promocion->idPromocion = $dbTable->insert( $promocion );
		} else {							
						
			//chequeo si la promocion esta en algún pedido
			if ( $this->inAnyOrder( $promocion->getId() ) ){			
				
				$promocion->activo = 0;
				$dbTable->update( $promocion );
				
				$oldId = $promocion->idPromocion;
				
				$promocion->activo = 1;
				$promocion->idPromocion = null;
				$promocion->idProducto = $dbTable->insert( $promocion );
			}else {
				$dbTable->update( $promocion );	
				
				$mapper->deleteByPromocion( $promocion );
				
			}	
		}			
		
		foreach( $promocion->getItems() as $item){
			$item->idPromocion = $promocion->idPromocion;
			$mapper->save( $item );
		}
		
		
		return $this;
	}
	
	/**
	 * @return bool
	 */
	public function delete( $promocion ){
	
		$dbTable= $this->getDbTAble();
		
		//chequeo si el producto esta en algún pedido
		if ( $this->inAnyOrder( $promocion->getId() ) ){			
			
			$promocion->activo = 0;
			return $dbTable->update(  $promocion  );
			
		}
		
		$this->logDeleted( $promocion );
		
		return $dbTable->delete( $promocion );
	}
	
	public function getById( $idPromocion, $idNegocio = null )
	{
		if ( $this->getIdentityMap()->isRegistered( 'Delivery_Model_Promocion', $idPromocion )){
			return $this->getIdentityMap()->get( 'Delivery_Model_Promocion', $idPromocion );
		}
		
		$dbTable= $this->getDbTAble();
		$row	= $dbTable->getById( $idPromocion, $idNegocio );
	
		if( empty($row) ){
			throw new Delivery_Model_Exception( Delivery_Model_Exception::PROMOTION_NOT_FOUND );
		}
		
		return $this->_fetch( $row );
	}
	
	public function getByIds( $ids )
	{
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'Promociones',
			$dbTable->getByIds( $ids )
		);
	}
	
	public function getByNegocio( $idNegocio )
	{
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'Promociones',
			$dbTable->getByNegocio( $idNegocio )
		);
	}
	
	/**
	 * @param array
	 * @return array objetos producto
	 */
	public function getByParams( $params, $offset = null, $limit = null, $order = null )
	{
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'Promociones',
			$dbTable->getByParams($params, $offset, $limit, $order)
		);
	}
	
	public function countByParams( $params )
	{
		return $this->getDbTAble()->countByParams($params);
	}
	
	public function inAnyOrder( $idPromocion ){
		
//		$mapper = self::getMapper('PedidosPromociones');
		$mapper = Delivery_Model_Factory::mapper('PromocionesPedido');
		$rowset = $mapper->getById( $idPromocion );		
		
		return empty($rowset) ? false : true;
	}
	
	public function loadNegocio( $promociones )
	{
		$mapper = Delivery_Model_Factory::mapper('Negocios');
		
		if ( $promociones instanceof Delivery_Model_Collection_Promociones || $promociones instanceof Delivery_Model_Collection_PromocionesPedido ){

			if (count( $promociones ) < 1){
				return;
			}
			
			$negocios = $mapper->getByIds( $promociones->getKeyValues( 'idNegocio', true ) );
			
			foreach ( $promociones as $promocion){
				$promocion->setNegocio(
					$negocios->offsetGet( $promocion->idNegocio )
				);
			}
			
			return $negocios;
		}
	 	elseif ( $promociones instanceof Delivery_Model_Promocion){
			
	 	    $negocio = $mapper->getById( $promociones->idNegocio );
	 	    
	 		$promociones->setNegocio( $negocio );
	 		
	 		return $negocio;
		}
	}
	
	public function loadItems( $promociones )
	{
		$mapper = Delivery_Model_Factory::mapper('ItemsPromocion');
		
		if ( $promociones instanceof Delivery_Model_Collection_Promociones && count($promociones)){
		
			$c = current( $promociones );
			$idNegocio = $c->idNegocio;
			
			$items = $mapper->getByPromocion( $promociones->getIds() );
			
			$mapper->loadData( $items, $idNegocio );
			
			foreach ( $promociones as $promocion){
				
				$promocion->setItems(
					$items->getByKey( 'idPromocion', $promocion->getId() )
				);
			}
		}
		
	 	elseif ( $promociones instanceof Delivery_Model_Promocion){
			
	 		$items = $mapper->getByPromocion( $promociones->getId() );
	 		
	 		$mapper->loadData( $items, $promociones->idNegocio );
	 		
	 		$promociones->setItems( $items );
		}
	}
	
	/**
	 * @param array
	 * @return object Delivery_Model_Producto
	 */
	protected function _fetch( $row )
	{
		$promocion = new Delivery_Model_Promocion( $row );
		
		$this->getIdentityMap()->set( $promocion, $promocion->getId() );
		
		return $promocion;
	}
	
}